home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / bytjl86b.arc / ANAGRAM.PAS < prev    next >
Pascal/Delphi Source File  |  1985-07-12  |  7KB  |  271 lines

  1. program Anagram;
  2.  
  3. {Copyright 1985 by Bob Keefer}
  4.  
  5. {Anagram.Pas takes a word of up to 10 letters from
  6. the keyboard and rearranges the letters into every
  7. possible permutation, or anagram, of the word.}
  8.  
  9. {It then evaluates the likelihood that each anagram
  10. is an English word by looking up every trigram in
  11. the word in a probability table, which is stored in
  12. a separate file PROB.DAT and is read into the array
  13. Probability[X,Y,Z]. Finally, it records the top
  14. scoring anagrams in Scoreboard and prints them to
  15. the screen.}
  16.  
  17. {The program must be compiled with the Turbo
  18.  "c" compiler option to a *.COM file.}
  19.  
  20.  
  21. {$A-} {compiler directive for recursion}
  22. {$C-} {.... ignore ^C and ^S breaks}
  23. {$I-} {.... no i/o checking}
  24. {$V-} {.... no string checking}
  25.  
  26.  
  27.  
  28. const
  29.      MaxLength = 13;   {biggest word + 3}
  30.      MaxScores = 15 ;  {how many winners to store}
  31.  
  32. type
  33.     ScoreLine = record {One line of the Scoreboard}
  34.               Winner : string[MaxLength] ;
  35.               Points : integer ;
  36.               end;
  37.  
  38. var
  39.    Word : array [1..Maxlength] of char;  {Word to permute}
  40.    Wordlength : integer; {Length of Word}
  41.    Probability : array [0..26,0..26,0..26] of integer;
  42.    ScoreBoard : array [1..MaxScores] of ScoreLine;
  43.    WordToScore : string[Maxlength]; {anagram}
  44.    DataFile : file of integer; {probability table}
  45.    TheWord : String[Maxlength]; {Word as string}
  46.    I : integer; {counter}
  47.  
  48.  
  49.  
  50. procedure Score;
  51.  
  52. var
  53.    X,Y,Z,I,J : integer ;
  54.    Total : integer ;
  55.    Unlikelihood : integer;
  56.  
  57.  
  58.    procedure KeepScore;
  59.  
  60.     var
  61.        N : integer;
  62.  
  63.        procedure ChalkItUp;
  64.            var
  65.                 TempScore, I : integer;
  66.                 TempName : String[MaxLength];
  67.  
  68.        begin  {ChalkItUp}
  69.            for I := N to MaxScores do
  70.            begin
  71.                 with ScoreBoard[I] do   {If an anagram}
  72.                 if Total>Points then    {scores better,}
  73.                 begin                   {then record it...}
  74.                      begin
  75.                           TempScore := Points;
  76.                           TempName := Winner;
  77.                           Points := Total;
  78.                           Winner := WordToScore
  79.                      end;
  80.                      if I<>MaxScores then
  81.  
  82.                      begin {..bump the rest down}
  83.                           with ScoreBoard[I+1] do
  84.                           begin
  85.                                WordToScore := TempName;
  86.                                Total := TempScore;
  87.                           end;
  88.                      end;
  89.                 end;
  90.            end;
  91.        end;   {ChalkItUp}
  92.  
  93.  
  94. begin {KeepScore}
  95.       for N := 1 to MaxScores do
  96.       begin
  97.            if WordToScore = ScoreBoard[N].Winner
  98.               then Total := 0; {eliminate duplicates}
  99.            if (Total > ScoreBoard[N].Points)
  100.                then ChalkItUp;
  101.            {record good-scoring words}
  102.       end;
  103. end;  {KeepScore}
  104.  
  105.  
  106. begin {procedure Score}
  107.      WordToScore := ' ' + WordToScore + ' ';
  108.      Total := 0;
  109.      Unlikelihood := 0;
  110.      for I := 1 to length(WordToScore) -2 do
  111.      begin
  112.           X := ord(copy(WordToScore,I,1))-64;
  113.           Y := ord(copy(WordToScore,I+1,1))-64;
  114.           Z := ord(copy(WordToScore,I+2,1))-64;
  115.           if X<0 then X:=0;
  116.           if Y<0 then Y:=0;
  117.           if Z<0 then Z:=0;
  118.  
  119.           Total := Total + Probability[X,Y,Z];
  120.           if Probability[X,Y,Z]=0 then Unlikelihood := succ(Unlikelihood);
  121.      end;
  122.      for J := 1 to Unlikelihood do Total := Total div 2;
  123.      KeepScore;
  124. end;  {procedure Score}
  125.  
  126.  
  127.  
  128. procedure Permute (CurrentLength : integer);
  129.  
  130. var
  131.    I : integer;
  132.  
  133.    procedure Switch;
  134.    var
  135.       Temp : char;
  136.    begin
  137.         Temp := Word[CurrentLength];
  138.         Word[CurrentLength] := Word[I];
  139.         Word[I] := Temp;
  140.    end; {Switch}
  141.  
  142.  
  143.    procedure Outword;
  144.  
  145.       begin
  146.          WordToScore:='';
  147.          for I := 1 to Wordlength do
  148.          WordToScore := WordToScore + Word[I];
  149.       end; {Outword}
  150.  
  151. begin {Permute body}
  152.       if CurrentLength = 1
  153.       then begin
  154.                 Outword;
  155.                 Score;
  156.            end
  157.       else for I := 1 to CurrentLength do
  158.           begin
  159.                Switch;
  160.                Permute(CurrentLength - 1);
  161.                Switch;
  162.           end;
  163. end; {Permute}
  164.  
  165.  
  166. procedure GetInput;
  167.  
  168. var
  169.   I : integer;
  170.  
  171. begin
  172.      write('Enter word: ');
  173.      readln(TheWord);
  174.      WordLength := length(TheWord);
  175.      for I := 1 to WordLength do
  176.      begin
  177.           Word[I] := upcase(copy(TheWord,I,1));
  178.      end;
  179.      TheWord := '';
  180.      for I := 1 to WordLength do
  181.          TheWord := TheWord + Word[I];
  182.  
  183. end; {procedure GetInput}
  184.  
  185. procedure ZeroScore;
  186. var I : integer;
  187.  
  188. begin
  189.      for I:= 1 to MaxScores do
  190.      begin
  191.           with ScoreBoard[I] do
  192.           begin
  193.                Points := 0;
  194.                Winner := '';
  195.           end;
  196.      end; {with}
  197. end; {ZeroScore}
  198.  
  199.  
  200. procedure PostScore;
  201.  
  202. var
  203.    I : integer;
  204.    GotIt : boolean;
  205.  
  206. begin
  207.      GotIt:=false;
  208.      for I := 1 to MaxScores do
  209.      begin
  210.           with ScoreBoard[I] do
  211.           begin
  212.                if Points>0 then
  213.                writeln(I:2, ' ',Winner, '  ', Points);
  214.           end; {with}
  215.      end; {for loop}
  216. end; {procedure PostScore}
  217.  
  218. procedure ReadProb;
  219.  
  220. var X,Y,Z : integer;
  221.  
  222. begin
  223.      assign(Datafile,'PROB.DAT');
  224.      reset(DataFile);
  225.      for X := 0 to 26 do begin
  226.          write('*');
  227.          for Y := 0 to 26 do begin
  228.              for Z := 0 to 26 do begin
  229.                   read(Datafile,Probability[X,Y,Z]);
  230.              end;
  231.          end;
  232.      end;
  233.      close(Datafile);
  234.      writeln;
  235. end;  {procedure ReadProb}
  236.  
  237.  
  238. procedure SignOn;
  239. begin
  240.      clrscr;
  241.      writeln('Anagram.Pas');
  242.      writeln('By Bob Keefer');
  243.      writeln('Copyright 1985');
  244.      writeln;
  245.      writeln;
  246.      writeln('To halt program, enter "*"');
  247.      writeln;
  248.      writeln;
  249.      writeln;
  250.      writeln('Reading Probability Table...');
  251. end; {procedure Signon}
  252.  
  253.  
  254. begin {Anagram program}
  255.       SignOn;      {Display signon message}
  256.       ReadProb;    {Read probability table}
  257.       clrscr;
  258.       repeat
  259.             GetInput;               {Get word}
  260.             ZeroScore;              {clear Scoreboard}
  261.             Permute (Wordlength);   {Evaluate words}
  262.             writeln;
  263.             PostScore;              {Print results}
  264.             writeln;
  265.             writeln;
  266.       until Word[1]='*';
  267. end.
  268. ;
  269.       until Word[1]='*';
  270. end.
  271.